#include "pdf_parser.h"
#include <stdlib.h>
#include <string.h>
#include <zlib.h>

// 辅助函数：读取字节
static char* read_bytes(FILE* fp, size_t length) {
    char* buf = malloc(length + 1);
    if (!buf) return NULL;
    fread(buf, 1, length, fp);
    buf[length] = '\0';
    return buf;
}

// FlateDecode解压（复用之前的实现）
static char* flate_decode(const char* compressed_data, size_t compressed_len, size_t* out_len) {
    *out_len = compressed_len * 10;
    char* uncompressed = malloc(*out_len);
    if (!uncompressed) return NULL;

    z_stream zs;
    memset(&zs, 0, sizeof(zs));
    zs.next_in = (Bytef*)compressed_data;
    zs.avail_in = compressed_len;
    zs.next_out = (Bytef*)uncompressed;
    zs.avail_out = *out_len;

    if (inflateInit2(&zs, -MAX_WBITS) != Z_OK) {
        free(uncompressed);
        return NULL;
    }

    int ret = inflate(&zs, Z_FINISH);
    inflateEnd(&zs);

    if (ret != Z_STREAM_END) {
        free(uncompressed);
        return NULL;
    }

    *out_len = zs.total_out;
    return realloc(uncompressed, *out_len + 1);
}

// 解析页面字体（简化：从页面字典提取字体信息）
static PdfFont* parse_page_fonts(FILE* fp, long page_offset, int* out_count) {
    *out_count = 0;
    if (fseek(fp, page_offset, SEEK_SET) != 0) return NULL;

    // 简化逻辑：假设页面字典包含/Font条目
    char buf[1024];
    while (fgets(buf, sizeof(buf), fp)) {
        if (strstr(buf, "/Font") != NULL) {
            // 模拟解析一个字体（实际需递归解析字体字典）
            PdfFont* fonts = malloc(sizeof(PdfFont) * 1);
            fonts[0].name = strdup("F1");
            fonts[0].base_font = strdup("Helvetica");
            // 实际PDF可能内嵌字体数据，这里简化为NULL（使用系统默认字体）
            fonts[0].font_file = NULL;
            fonts[0].font_size = 0;
            *out_count = 1;
            return fonts;
        }
        if (strstr(buf, "stream") != NULL) break; // 到达内容流，停止解析字体
    }
    return NULL;
}

// 解析单页内容
static PageContent* parse_single_page(FILE* fp, long page_offset) {
    PageContent* page = malloc(sizeof(PageContent));
    if (!page) return NULL;
    page->content = NULL;
    page->length = 0;
    page->fonts = NULL;
    page->font_count = 0;

    // 解析字体
    page->fonts = parse_page_fonts(fp, page_offset, &page->font_count);

    // 解析内容流（复用之前逻辑，增加多页支持）
    if (fseek(fp, page_offset, SEEK_SET) != 0) goto error;

    char buf[1024];
    size_t stream_length = 0;
    int is_flate = 0;

    while (fgets(buf, sizeof(buf), fp)) {
        if (strstr(buf, "/Length") != NULL) {
            sscanf(buf, "/Length %zu", &stream_length);
        }
        if (strstr(buf, "/Filter /FlateDecode") != NULL) {
            is_flate = 1;
        }
        if (strstr(buf, "stream") != NULL) break;
    }

    if (stream_length == 0) goto error;

    char* compressed_data = read_bytes(fp, stream_length);
    if (!compressed_data) goto error;

    if (is_flate) {
        page->content = flate_decode(compressed_data, stream_length, &page->length);
    } else {
        page->content = strdup(compressed_data);
        page->length = stream_length;
    }

    free(compressed_data);
    if (!page->content) goto error;
    return page;

error:
    pdf_free_document(NULL); // 简化清理
    free(page);
    return NULL;
}

// 解析PDF文档（多页）
PdfDocument* pdf_parse_document(FILE* fp) {
    // PdfDocument* doc = malloc(sizeof(PdfDocument));
    // if (!doc) return NULL;
    // doc->pages = NULL;
    // doc->page_count = 0;
    // doc->current_page = 0;

    // // 简化逻辑：假设PDF有3页（实际需解析Page Tree）
    // // 这里手动指定3个页面的偏移量（实际应从交叉引用表读取）
    // long page_offsets[] = {100, 500, 900}; // 示例偏移量
    // doc->page_count = sizeof(page_offsets) / sizeof(long);
    // doc->pages = malloc(sizeof(PageContent*) * doc->page_count);

    // for (int i = 0; i < doc->page_count; i++) {
    //     doc->pages[i] = parse_single_page(fp, page_offsets[i]);
    // }

    // return doc;
    PdfDocument* pdf_parse_document(FILE* fp) {
    PdfDocument* doc = malloc(sizeof(PdfDocument));
    if (!doc) return NULL;
    doc->pages = NULL;
    doc->page_count = 0;
    doc->current_page = 0;

    // 示例：假设3个页面（实际需解析PDF的Page Tree）
    long page_offsets[] = {100, 500, 900}; // 页面偏移量（示例值）
    doc->page_count = sizeof(page_offsets) / sizeof(long);
    
    // 修正：分配 PageContent* 数组（指针数组）
    doc->pages = malloc(sizeof(PageContent*) * doc->page_count); 
    if (!doc->pages) {
        free(doc);
        return NULL;
    }

    // 解析每个页面（存储的是指针）
    for (int i = 0; i < doc->page_count; i++) {
        doc->pages[i] = parse_single_page(fp, page_offsets[i]);
    }

    return doc;
}
}

// 页面导航
int pdf_navigate_page(PdfDocument* doc, int delta) {
    if (!doc) return -1;
    int new_page = doc->current_page + delta;
    if (new_page >= 0 && new_page < doc->page_count) {
        doc->current_page = new_page;
        return 0;
    }
    return -1; // 越界
}

// 释放文档资源
void pdf_free_document(PdfDocument* doc) {
    // if (!doc) return;
    // for (int i = 0; i < doc->page_count; i++) {
    //     if (doc->pages[i]) {
    //         free(doc->pages[i]->content);
    //         for (int j = 0; j < doc->pages[i]->font_count; j++) {
    //             free(doc->pages[i]->fonts[j].name);
    //             free(doc->pages[i]->fonts[j].base_font);
    //             free(doc->pages[i]->fonts[j].font_file);
    //         }
    //         free(doc->pages[i]->fonts);
    //         free(doc->pages[i]);
    //     }
    // }
    // free(doc->pages);
    // free(doc);

    if (!doc) return;
    // 释放每个页面的内容
    for (int i = 0; i < doc->page_count; i++) {
        if (doc->pages[i]) {  // 每个元素是 PageContent*
            free(doc->pages[i]->content);
            // 释放字体相关内存
            for (int j = 0; j < doc->pages[i]->font_count; j++) {
                free(doc->pages[i]->fonts[j].name);
                free(doc->pages[i]->fonts[j].base_font);
                free(doc->pages[i]->fonts[j].font_file);
            }
            free(doc->pages[i]->fonts);
            free(doc->pages[i]); // 释放单个 PageContent
        }
    }
    free(doc->pages); // 释放指针数组
    free(doc);
}